package policia;

import java.util.LinkedList;
import java.util.Observable;
import java.util.Random;

import objetos.*;
import gui.Field;

public class Policia extends Observable{

	private Field campo;
	private LinkedList<Posicao> posicoesEmCampo;

	public Policia(Field campo) {
		super();
		this.campo = campo;
		posicoesEmCampo = campo.getPosicoes();
		addObserver(this.campo);
	}

	public Posicao devolverPosicaoAVolta(Posicao p){
		Random random = new Random();
		int Posicao_aleatoria = random.nextInt(4);

		switch (Posicao_aleatoria) {
		case 0:

			int indice_cima = p.getIndice()-campo.getNUM_LIN();
			if(indice_cima <= 0)
				devolverPosicaoAVolta(p);
			else{
				return posicoesEmCampo.get(indice_cima);
			}

		case 1:
			int indice_baixo = p.getIndice()+campo.getNUM_LIN();
			if(indice_baixo >= posicoesEmCampo.size())
				devolverPosicaoAVolta(p);
			else{
				return posicoesEmCampo.get(indice_baixo);
			}

		case 2:
			int indice_esquerda = p.getIndice()-1;
			if(indice_esquerda < 0)
				devolverPosicaoAVolta(p);
			else if(posicoesEmCampo.get(indice_esquerda).getX()> p.getX())
				devolverPosicaoAVolta(p);
			else{
				return posicoesEmCampo.get(indice_esquerda);
			}

		case 3:
			int indice_direita = p.getIndice()+1;
			if(indice_direita>=posicoesEmCampo.size()-1)
				devolverPosicaoAVolta(p);
			else if(posicoesEmCampo.get(indice_direita).getX()>p.getX())
				return posicoesEmCampo.get(indice_direita);
			else{
				devolverPosicaoAVolta(p);
			}
		}
		return devolverPosicaoAVolta(p);
	}

	public Posicao posicaoAleatoria() {
		Random random = new Random();
		int indice_posicao = random.nextInt(posicoesEmCampo.size()-1);
		if(posicoesEmCampo.get(indice_posicao).isOcupada())
			posicaoAleatoria();
		else {
			return posicoesEmCampo.get(indice_posicao);
		}
		return null;
	}

	public synchronized void pintar(Posicao p) {
		posicoesEmCampo.get(p.getIndice()).ocupar();
		notifyObservers(posicoesEmCampo);
	}

	public synchronized void mover(Posicao p){
		Posicao mover = posicoesEmCampo.get(p.getIndice());
		pintar(mover);

	}

	public synchronized void remover(Posicao last) {
		posicoesEmCampo.get(last.getIndice()).setOcupada(false);
		notifyObservers(posicoesEmCampo);
	}

	public Posicao devolverAppleAleat() {
		for(Posicao p: posicoesEmCampo)
			if(p.hasApple())
				return p;
		return null;
	}
}


